﻿#ifndef _STORAGE_INTERFACE_H
#define _STORAGE_INTERFACE_H
#include <stdint.h>
#include <time.h>
#include "storage_callback.h"

#define MAX_CH_NUM   4
//#define _SUPPORT_DISK_GROUP_
typedef struct _STORAGE_CH_INFO_
{
	int      enable;	   //通道录像开关
	char     name[32];        //通道名称
	uint32_t mml_cache_sz;    //多媒体缓冲
	uint32_t rec_cache_sz;    //录像写入对齐缓冲的大小
	uint32_t replay_cache_sz; //回放缓冲大小
	uint32_t maxFrameSize;    //单帧最大长度
	uint32_t frameRate;		  //帧率
}CH_INFO;

typedef struct _StorageConfig_
{
    int  channelNum;	    //支持的录像通道数
	int  cache_chNum;       //所有缓存通道

	uint8_t b_rec_audio;   //是否录制音频
	uint8_t bMixAudio;		//是否混合音频发送

	uint8_t bCycleRec;		//循环录像
	uint8_t bPrepare;		//是否开启预录像

	uint8_t scan_drv_no ;   //开始扫描的磁盘号
	uint8_t nor_space;      //正常录像占用百分比
	uint8_t evt_space;      //紧争录像占用百分比
	uint8_t pho_space;      //图片占用空间
	uint32_t pho_spaceMB;   //图片固定大小

	int     pkt_mode;       //打包模式
	int     pkt_secs;      //打包时间
	int     pkt_sz_MB;     //按块大小来打包

	uint32_t record_size;   //录像文件大小
	uint32_t sptClientNum;  //支持的客户数目
   	uint32_t recStatusBIT;	//动态录像状态位,

	char dev[20];         //默认设备名
	char df_mntPath[60];  //默认挂载目录
	char norDir[32];      //正常录像文件目录
	char titile_dot[2];    //分隔符
	char evtDir[32];      //紧急录像文件目录
	char capture[32];     //抓拍文件目录
	char thumbnailDir[32];//缩略图目录
	char file_fmt_ext[8]; //文件格式扩展名
	int  fbox_fmt;		  //文件打包格式

	uint16_t  nPerpareSecs;  //最大15S ,根据不同的客户需求来做
	uint16_t  ioContinue_tm; //持续录像时间
    CH_INFO chInfo[MAX_CH_NUM];
	uint32_t getfrm_sz;    //获取一帧音视频缓冲的大小
}StorageConfig;

typedef struct _RECORD_DIR_INFO_
{
	char df_mntPath[60]; // 默认挂载目录
	char norDir[32];     //正常录像文件目录
	char evtDir[32];     //紧急录像文件目录
	char capture[32];    //抓拍文件目录
	char thumbnailDir[32];//缩略图目录
	char separtor[8];    //名称分隔符
	int  fbox_fmt;		 //文件打包格式
}RECORD_DIR_INFO_S,*PRECORD_DIR_INFO_S;

typedef struct _StorageSpaceInfo_
{
	uint32_t diskNum;          //磁盘个数
	uint32_t freeSpace;        //剩余空间
	uint32_t totalSpace;       //磁盘总大小
	uint32_t dataPercent;      //数据占用百分比s
}StorageSpaceInfo;

typedef enum _disk_bus_type_
{
	BUS_TYPE_SATA  = 0,		//本地磁盘
	BUS_TYPE_ESATA = 1,		//可以支持热插拨的SATA接口
	BUS_TYPE_USB   = 2,		//USB接口
	BUS_TYPE_IPSAN = 3,		//IPSAN网络接口
	BUS_TYPE_NAS   = 4,		//NAS
}DISK_BUS_TYPE;


typedef enum _playback_type_
{
	REPLAY_NULL = 0,					//未设置
	REPLAY_STOP,						//停止
	REPLAY_PLAY,						//播放
	REPLAY_PAUSE,						//暂停
	REPLAY_BACKUP,						//备份

	REPPAY_DOWNLOAD,					//远程下载
	REPLAY_NORMAL  = 0x10,				//正常回放
	REPLAY_ONEFRAME= 0x20,				//单帧播放
	REPLAY_SLOW    = 0x40,				//慢进 2, 4, 8, 16, 32
	REPLAY_FAST    = 0x80,				//快进 2, 4, 8, 16, 32
	REPLAY_REBACK  = 0x100,				//回退 8, 16, 32
	REPLAY_REALTIIME= 0x200,            //实时回放
}PLAYBACK_MODE;

typedef enum _FS_RECORD_TYPE_
{
	FS_RECORD_NONE			= 0x0000,		//没有录像
	FS_RECORD_SCHEDULE		= 0x0001,		//定时录像
	FS_RECORD_MANUAL		= 0x0002,		//手动录像
	FS_RECORD_MOTION		= 0x0004,	    //移动侦测报警录像
	FS_RECORD_IOALARM		= 0x0008,		//传感器报警录像
	FS_RECORD_SHELTER		= 0x0010,		//遮挡报警录像
	//后续扩展支持
	FS_RECORD_BEHAVIOR		= 0x0020,		//行为分析录像

}FS_RECORD_TYPE;

typedef enum _record_status_
{
	RECORD_STATUS_UNUSED = 0,		//未使用
	RECORD_STATUS_USED   = 0x01,	//正常使用中（未锁定、未隐藏）
	RECORD_STATUS_LOCK   = 0x02,	//被锁定
}REC_STATUS;

//==============================================
// Define data structure
//==============================================
typedef struct _DiskInfo_
{
	int status;					//0 表示掉线　1 表示激活
	int type;					//磁盘接口类型：本地 0 SATA）、1 E_SATA、2 USB， 3 IP_SAN、4 NAS、、等（只读�?
	int property;				//属性：只读、冗余、读写
	int isFormated;				//是否已经格式化
	int diskIndex;				//磁盘编号
	int portType;				//端口类型	//废弃掉这个变量,后续会删除掉
	int portNum;				//端口号

	uint32_t   recSpace;		//录像总容量：MB（只读）
	uint32_t   recFreeSpace;	//录像剩余容量：MB（只读）

	uint32_t   comPartSpace;    //通用盘的空间大小
	uint32_t   comPartFreeSpace;//剩余大小

	uint32_t   totalSpace;		//磁盘总容量MB
}DiskInfo;

typedef struct _StorageStat_
{
	uint8_t reserved1;     //保留
	uint8_t CycleRec;     //0-stopped,1-starting,2-start,3-stopping
	uint8_t EvtRecStat;   //0-stopped,1-starting,2-start,3-stopping
	uint8_t audioRecStat; //0-close,1-open
	uint8_t sdcordStat;   //0-normal,1-not insert,2-format error,3-space too small,4-write failed,5-formatting
	uint8_t resolution;   //0-1080P, 1-720P
	uint8_t duration;     //Cycle recording duration, uint minutes.
	uint8_t reserved2;     //
}StorageStat,*PStorageStat;

struct UDevInfo
{
	char mountPoint[64];	//挂载路径
	char deviceText[36];	//设备名称
	long long totalSize;	//Byte
	long long freeSpace;	//Byte
	int udevStatus;			//0-正常挂载,可读写;1-正常挂载,不可读写;2-正常挂载,未格式化;3-正常卸载
};
typedef struct _RECORD_CH_INFO_
{
	uint32_t chManualBIT;
	int    sptChNum;  //支持的通道数
	char   recType[32];//最多支持32通道
}RECORD_CH_INFO;


typedef struct _BACKUP_PARAM_
{
	int         selectMode;			//选择备份模式
	uint16_t	style;				//采用USB, FTP, DISK, DVD, 方式备份
	uint16_t 	fileFormat;			//备份格式, [0 *.asf], [1 *.mp4] [2  bin]
	int         recStartOffset;		//开始的偏移
	int         recNum;				//备份的数目
	char		partPath[128];		//挂载相对路径
}BACKUP_PARAM;

typedef struct _PLAYBACK_MODE_INFO_
{
	int	palyMod;		//状态PLAYBACK_TYPE
	int	speed;			//速率 1, 2, 4, 8, 16, 32

}PLAYBACK_MODE_INFO;

typedef enum _DEV_STATUS
{
	DEV_NORMARL       = 0,
	DEV_NOREADWRITE   = 1,
	DEV_UNFORMATED    = 2,
	DEV_UNLOADED      = 3,
}DEV_STATUS;

typedef struct _SCHEDULE_REC_
{
    int is_Enable;
	uint64_t scheduleTime[7];
}SCHDULE_REC;

//录像段文件信息
typedef struct _FILE_INFO_
{
	uint32_t    NO;				//文件临时编号
	uint8_t		bCheck;			//是否选中
	uint8_t		channel;		//通道号
	uint8_t		dataSource;		//数据来源	DATA_SOURCE_ID
	uint8_t     timeZone;       //时区
	int64_t	    fileSize;		//录像段大小

	time_t		tmStart;		//开始时间 16+
	time_t		tmEnd;			//结束时间

	uint32_t	indexNO;		//磁盘上面的索引
	uint8_t		status;			//状态：REC_STATUS
	uint8_t		recordType;		//录像类型 record_type_
	uint8_t		diskIndex;		//磁盘编号
	uint8_t     recSegIndex;	//录像段编号
}FILE_INFO;

typedef struct CUR_PLAYFILE_INFO
{
	int     curTmSec;       //当前帧在文件中的第多少秒
	uint32_t curFrmNo;      //当前文件的第多少帧
	int     fps;            //视频的帧率
	int     totalSec;       //总时间
}CUR_PLAYFILE_INFO_S;

typedef struct _REC_DAY_
{
	time_t tm_day_start;  // 日期的开始
	time_t tm_day_end;	  // 日期的结束　
}FS_REC_DAY;	//便于快速查看所有录像段

typedef enum _download_type
{
	DOWNLOAD_PLAY   = 0,	//远程回放
	DOWNLOAD_BACKUP = 1,	//远程备份
}DOWNLOAD_TYPE;

typedef struct _DOWNLOAD_RECORD_
{
	int	     downloadType;		//DOWNLOAD_TYPE // 0: 远程回放 1:远程备份
	time_t	 startTime;			//起始时间 实时备份
	time_t	 endTime;			//结束时间(在downloadType为DOWNLOAD_PLAY时无效）
	int      ch;                //通道
	int		 recType;			//录像类型
	int		 userBIT;			//用户ID位
}DOWNLOAD_RECORD;

typedef struct _DISK_PERFORMANCE_
{
	int wtSpeed;	//KB/S 会精确到后面两位小数点．
	int rdSpeed;	//KB/S
	int realWtSpd;  //KB/S 实时的写入速度
	int realRdSpd;	//KB/S 实时的读取速度
}DiskPerformance;

typedef struct _REC_SEGMENT_
{
	uint8_t		reserve;		//保留
	uint8_t		channel;		//通道号
	uint8_t		dataSource;		//数据来源	DATA_SOURCE_ID
	uint8_t     timeZone;       //时区2017年5月27日       //uint8_t     reserve;        、、
	int64_t	    fileSize;		//录像段大小

	time_t		tmStart;		//开始时间 16+
	time_t		tmEnd;			//结束时间

	uint32_t	indexNO;		//磁盘上面的索引
	uint8_t		status;			//状态：RECORD_FILE_STATUS
	uint8_t		recordType;		//录像类型 record_type_
	uint8_t		diskIndex;		//磁盘编号
	uint8_t     recSegIndex;	//录像段编号
}RECORD_SEGMENT,*PRECORD_SEGMENT;

typedef struct _SWITCH_FILE_PARM_
{
	int swithFileMod; // 0: 按时间来循环切换文件 1:按文件块来切换文件
	int parm;        // 如果是按时间来切换单位就是秒， 如果是按文件切换单位就是MB
}SWITCH_FILE_PARM;

typedef enum
{
	AUDIO_G726   = 0,
	AUDIO_G711A  = 1,
	AUDIO_UNKNOWN ,
}AUDIO_TYPE;

typedef enum
{
	SWITCH_FILE_BY_TIME    = 0,
	SWITHC_FILE_BY_SZMB  = 1,
}SWITCH_FILE_MODE;

#define  LOCAL_CLIENT_ID      0
#define  TELNET_CLINET_ID     1   //网络用户从1开始编号，可以支持到4个
#define  ALL_REC_TYPE         -1
#   if defined(_USRDLL)
#  define LHN_API _declspec(dllexport)
#   else
#   define LHN_API
#   endif

typedef struct _FIFO_BUF_INFO_
{
	uint8_t * buf;	     //缓冲地址
	uint8_t  jump_flag;	 //是否缓冲地址是否回绕1：表示已经出现地址不连续的情况　0：正常　
	int		 frmType;	 //帧类型
	uint32_t frame_size; //当前帧的数据长度
	uint32_t free_size;  //剩余可用空间　　　剩余可用的缓冲
	uint64_t last_frmTm; //最后一帧的时间　　最后一帧时间
	uint32_t frameNo;
}FIFO_BUF_INFO;

#ifdef __cplusplus
extern "C" {
#endif

	//初始化接口
	int LHN_API   STORAGE_INIT(StorageConfig cfg);

	int LHN_API  STORAGE_SET_REC_DIR(char * dir,RECORD_DIR_INFO_S  dirInfo);

	 //关闭模块
	int LHN_API   STORAGE_UNINIT(StorageConfig cfg);

	//个别参数修改接口

	time_t LHN_API STORAGE_GET_REC_MAXTIME();

	void LHN_API STORAGE_SET_REC_SIZE(uint32_t recordSize);

	void LHN_API STORAGE_SET_SWITCH_PARM(int switchMod,int parm);

	void LHN_API STORAGE_SET_NOR_SPACE(uint32_t space);

	//判断当前磁盘是否已经初始化
	int LHN_API STORAGE_DISK_IS_INIT(char * dev);

	void LHN_API STORAGE_SET_STATUS_CBAK(STORAGE_STATUS_CBAK cbak);

	//录像功能是否正常
	int LHN_API STORAGE_RECORD_FUNC_ISOK();

	int LHN_API  STORAGE_START_RECORD();

	int LHN_API  STORAGE_STOP_RECORD();

	int LHN_API STOAGE_GET_FREESPACE(uint32_t * pFreeMB, uint32_t* pTotalMB);

	int LHN_API  STOAGE_GET_DISKINFO(int diskNO);

	void LHN_API STORAGE_GET_STORAGE_STAT(StorageStat * pStat);
	//设置报警录像的时间，预录时间及持续录像时间
	int LHN_API STORAGE_SET_IOALARM(int prepareTm, int ccontinueTm);

	int LHN_API START_EVT_RECORD(int ch);

	int LHN_API STOP_EVT_RECORD(int ch);

	//录像其它不同类型的录像使用，在调用此接口时候如果发现录像线程没有开启会重新打开录像线程
	int LHN_API START_RECORD(int ch, FS_RECORD_TYPE recType, int recTmSecs);

	//按通道号只停止手动录像
	int LHN_API STOP_MANUAL_RECORD(int ch);

	//按通道位标记一次做到停止
	int LHN_API SET_RECORD_SWITCH(int chSwith);

	void LHN_API SET_AUDIO_REC_SWITCH(int ch,int bEnable);

	LHN_API char *  STORAGE_GET_CUR_RECFILE(int ch);

	//设置是否循环录像
	int LHN_API STORAGE_CYCLE_REC(int bEnable);

	//设置录像计划表
	int LHN_API SET_SCHEDULE_TIME(int ch, SCHDULE_REC schduleTime);

	void LHN_API SetVideoParm(int ch,int width,int height,int frame_rate);

	void LHN_API SetAudioParm(int ch,int audio_channels, long rate, int bits, int format);

	//获取某个通道的计划表
	SCHDULE_REC LHN_API GET_SCHEDULE_TIME(int ch);

	//获取录像段中最大的时间
	int LHN_API STORAGE_GET_LAST_REC_TIME();

	int LHN_API STORAGE_FORMAT_TO_RECDISK(char * dev,int recSizeMB,int compartMB);

	int LHN_API STORAGE_GET_DATA_PERCENT();

	int LHN_API FIFO_READ_FRAME(FIFO_BUF_INFO * fifoInfo,int ch,int clientID);

	int LHN_API FIFO_GET_FRAME_WATER(int ch,int clientID);

	//视频存储参数
	void LHN_API STORAGE_SET_VIDEO_RESSOLUTION(int width, int height,int channel);


	int LHN_API REC_WRITE_GPSINFO(unsigned char * buf,uint32_t dataSize,int ch);

	//获取录像文件的写入进度
	int  LHN_API STORAGE_GET_FREC_PERCENTT(int ch);

	uint32_t LHN_API STORAGE_GET_FREC_INDEX(int ch);

	uint32_t LHN_API  STORAGE_GET_FREC_SN(int ch);

	int LHN_API  STORAGE_GET_CACHE_WATER(int ch);
	//回放使用
	//拷贝一帧数据出来
	int LHN_API REPLAY_READ_MIX_AUDIO(int mix_flag);

	int LHN_API REPLAY_FIFO_READ_FRAME(unsigned char * buf,int bufSize,int ch,int clientID);

	int LHN_API REPLAY_FIFO_READ_GPSINFO(uint32_t gpsTm,unsigned char * buf,int bufSize,int ch,int clientID);

	int LHN_API REPLAY_FIFO_CLEAR(int ch,int clientID);

	int LHN_API REPLAY_SYNC_WAIT( unsigned long long frmTm,int mulCH_sync,int ch,int clientID);

	int LHN_API REPLAY_GET_MODE(PLAYBACK_MODE_INFO * pModeInfo);

	RECORD_CH_INFO LHN_API GET_RECORD_CH_INFO();

	void LHN_API SET_REC_CYCLE(int bEnable);

	int LHN_API SET_PREARE_REC(uint8_t bEnable, int nSecs);

	//搜索当月中存在录像的天数
	int LHN_API SEARCH_RECORD_ALLDAY(char* recDayBuf,int bufSize,int64_t chBit);

	int LHN_API SEARCH_REC_DAYOFMONTH(int year, int month, int recType);

    int LHN_API SEARCH_HISTORY_REC(unsigned char* fileBuf,int bufSize,time_t tmStart,time_t tmEnd,int32_t ch,int recType,int clientID);

    int LHN_API SEARCH_REC(unsigned char* fileBuf,int bufSize,time_t tmStart, time_t tmEnd, int32_t chBit,int recType,int clientID);

	int LHN_API SEARCH_REC_BY_PATHTYPE(char* fileBuf,int number, int type ,int path);

	int LHN_API STORAGE_GET_FILELST_INFO(int pageFileNum,int chBit);

	int LHN_API STORAGE_GET_PAGE(unsigned char* fileBuf,int bufSize,int page_no);

	int LHN_API GET_FILENAME_BYINFO(char * fileName,FILE_INFO finfo);

	int LHN_API LOCK_RECORD(RECORD_SEGMENT * recSeg);

	int LHN_API UNLOCK_RECORD(RECORD_SEGMENT * recSeg);

	//回放接口,可以支持远程点播,ClientID  0:表示本地用户　　1：远程用户　
	int LHN_API PLAYBACK_BYTIME(time_t startTime,time_t endTime,  int channel,int clientID) ;

	//远程回放一个通道的数据
	int LHN_API TELNET_REPLAY(time_t startTime,time_t endTime, int ch,int clientID);

	int LHN_API PLAYBACK_BYFILEINO(int file_idx, int clientID);

	int LHN_API PLAYBACK_BYFILENAME(char * fileName,int clientID);

	int LHN_API PLAYBACK_GET_INFO(CUR_PLAYFILE_INFO_S * pInfo,int ch);

	int LHN_API PLAYBACK_PAUSE(int ch,int clientID) ;

	int LHN_API PLAYBACK_RESUME(int ch,int clientID);

	int LHN_API PLAYBACK_STOP(int ch,int clientID) ;

	int LHN_API PLAYBACK_STATUS(int ch,time_t playTime,int clientID);

	int LHN_API PLAYBACK_SEEKTIME(time_t time,int ch,int clientID) ;

	int LHN_API PLAYBACK_SETMODE(PLAYBACK_MODE playMod, int speed,int ch,int clientID);

	//磁盘管理接口
	int LHN_API GET_DISKINFO_NUM();

	int LHN_API BACKUP_AUDIO_PARM(AUDIO_TYPE audoType,int samplerate,int audioChannel,int PCMBitSize);

	int LHN_API BACKUP_START(unsigned char * reclist,int recNum, int fileFormat,const char * filePath);

	int LHN_API BACKUP_PAUSE() ;

	int LHN_API BACKUP_STOP();

	//远程下载
	int LHN_API DOWNLOAD_START(int clientID,DOWNLOAD_RECORD pDownloadParam);

	int LHN_API DOWNLOAD_STOP(int clientID,int ch);

	int LHN_API SET_STORAGECFG(StorageConfig config);

	StorageConfig LHN_API GET_STORAGE_CFG();

	DiskPerformance	LHN_API GET_DISK_PERFORMANCE();

	StorageSpaceInfo LHN_API GET_DISK_SPACE_INFO();

	//DEBUG专用导出录像文件
	int LHN_API ExportRecordFile(char * dev,int fileIdx,int fileSize,char * destFile);

	//多媒体 音视频缓存模块API
	//整个模块初始化的时候有开辟缓存，如果需要临时改变动大小，可以调用这个接口
	int LHN_API MML_FIFO_Open(int ch, int buf_sz);

	int LHN_API MML_Write_frame(unsigned char * buf,uint32_t dataSize,int frameType,int ch,int64_t pts);

	int LHN_API MML_Write_IFame_sps(unsigned char * buf,uint32_t dataSize,unsigned char * sps_pps_buf,int sps_pps_sz,int ch,int64_t pts);

	int LHN_API MML_Read_Frame(unsigned char * buf, int buf_sz,int ch,int clientID);

	int LHN_API MML_FIFO_SeekTime(int64_t startTime,int prepareSecs,int ch);

	int LHN_API MML_FIFO_Refresh(int ch,int clientID);

	int LHN_API MML_FIFO_Water(int ch,int clientID);

	int LHN_API MML_FIFO_DataSize(int ch,int clientID);

	int LHN_API MML_FIFO_Free(int ch,int clientID);

	int LHN_API MML_FIFO_BitRateByte(int ch);

	int LHN_API REPLAY_TEST(int ch);

	int LHN_API REPLAY_TEST_STOP(int ch);

	int LHN_API GET_RECORD_INDEX_INFO(unsigned char  * buf,int buf_size,int ch);

	int LHN_API GET_RECORD_GPS_INFO(unsigned char  * buf,int buf_size,int ch);

	int LHN_API GET_SIMULATE_Rate();
	int LHN_API OPEN_SIMULATE(char * file,int chNum);


#ifdef __cplusplus
}
#endif
#endif /* _STORAGE_INTERFACE_H */
